//package cn.xie.blog.servergateway.util;
//
//import cn.xie.blog.servergateway.security.PermitAll;
//import org.springframework.stereotype.Component;
//
//import org.reflections.Reflections;
//import org.springframework.core.annotation.AnnotatedElementUtils;
//import org.springframework.web.bind.annotation.*;
//
//import java.lang.reflect.Method;
//import java.util.HashSet;
//import java.util.Set;
//
///**
// * @author: xiaoxie
// * create: 2025-04-25 20:43
// * @BelongsProject: blog-parent
// * @BelongsPackage: cn.xie.blog.authcenter.util
// * description: 动态获取白名单的工具类
// */
//@Component
///**
// * 动态扫描带有 @PermitAll 注解的接口，获取其路径
// */
//public class PermitAllUrlScanner {
//
//    /**
//     * 扫描指定基础包路径下的所有带有 @PermitAll 注解的接口，并返回其路径
//     * @param basePackage 要扫描的基础包路径
//     * @return 返回包含所有无需身份验证接口路径的集合
//     */
//    public static Set<String> scanPermitAllUrls(String basePackage) {
//        Set<String> permitAllUrls = new HashSet<>();
//        // 使用 Reflections 库扫描基础包路径下的所有类
//        Reflections reflections = new Reflections(basePackage);
//        // 获取所有带有 @RestController 注解的类（控制器类）
//        Set<Class<?>> controllerClasses = reflections.getTypesAnnotatedWith(RestController.class);
//
//        for (Class<?> controllerClass : controllerClasses) {
//            // 获取控制器类中的所有方法
//            Method[] methods = controllerClass.getDeclaredMethods();
//            for (Method method : methods) {
//                // 检查方法是否带有 @PermitAll 注解
//                if (AnnotatedElementUtils.hasAnnotation(method, PermitAll.class)) {
//                    // 获取方法的请求映射路径
//                    String url = getRequestMappingValue(controllerClass, method);
//                    if (url != null) {
//                        // 将路径添加到无需身份验证的白名单集合中
//                        permitAllUrls.add(url);
//                    }
//                }
//            }
//        }
//
//        return permitAllUrls;
//    }
//
//    /**
//     * 获取控制器类和方法的请求映射路径
//     * @param controllerClass 控制器类
//     * @param method          控制器类中的方法
//     * @return 返回完整的请求路径
//     */
//    private static String getRequestMappingValue(Class<?> controllerClass, Method method) {
//        // 尝试获取控制器类上的 @RequestMapping 注解
//        RequestMapping classRequestMapping = controllerClass.getAnnotation(RequestMapping.class);
//        // 尝试获取方法上的 @RequestMapping 注解
//        RequestMapping methodRequestMapping = method.getAnnotation(RequestMapping.class);
//
//        // 如果控制器类和方法都带有 @RequestMapping 注解，则组合它们的路径
//        if (classRequestMapping != null && methodRequestMapping != null) {
//            String classPath = classRequestMapping.value()[0];
//            String methodPath = methodRequestMapping.value()[0];
//            return classPath + "/" + methodPath;
//        }
//
//        // 支持其他注解如 @GetMapping, @PostMapping 等
//        GetMapping getMapping = method.getAnnotation(GetMapping.class);
//        if (getMapping != null) {
//            // 递归调用以获取完整的请求路径
//            return getRequestMappingValue(controllerClass, getMapping.path()[0]);
//        }
//
//        PostMapping postMapping = method.getAnnotation(PostMapping.class);
//        if (postMapping != null) {
//            return getRequestMappingValue(controllerClass, postMapping.path()[0]);
//        }
//
//        PutMapping putMapping = method.getAnnotation(PutMapping.class);
//        if (putMapping != null) {
//            return getRequestMappingValue(controllerClass, putMapping.path()[0]);
//        }
//
//        DeleteMapping deleteMapping = method.getAnnotation(DeleteMapping.class);
//        if (deleteMapping != null) {
//            return getRequestMappingValue(controllerClass, deleteMapping.path()[0]);
//        }
//
//        PatchMapping patchMapping = method.getAnnotation(PatchMapping.class);
//        if (patchMapping != null) {
//            return getRequestMappingValue(controllerClass, patchMapping.path()[0]);
//        }
//
//        // 如果未找到任何映射注解，则返回 null
//        return null;
//    }
//
//    /**
//     * 根据控制器类和方法路径获取完整的请求路径
//     *
//     * @param controllerClass 控制器类
//     * @param methodPath      方法的路径
//     * @return 返回完整的请求路径
//     */
//    private static String getRequestMappingValue(Class<?> controllerClass, String methodPath) {
//        // 尝试获取控制器类上的 @RequestMapping 注解
//        RequestMapping classRequestMapping = controllerClass.getAnnotation(RequestMapping.class);
//        if (classRequestMapping != null) {
//            // 如果控制器类有 @RequestMapping 注解，则组合类路径和方法路径
//            String classPath = classRequestMapping.value()[0];
//            return classPath + "/" + methodPath;
//        }
//        // 如果控制器类没有 @RequestMapping 注解，则仅返回方法路径
//        return "/" + methodPath;
//    }
//}